import * as path from 'path';
/**
 * 获取所有子路由
 */
export const getChildrenRoutes = (routes) => {
    let result = [];
    routes.forEach(route => {
        if (route.children && route.children.length > 0) {
            result.push(...route.children);
        }
    });
    return result;
};

/**
 * 处理脱离层级路由 This is no longer the case. Verify if you need this module and configure a polyfill for it.
 */
export const filterRoutes = (routes) => {
    // 所有的子路由集
    const childrenRoutes = getChildrenRoutes(routes);
    // 根据子路由集 进行查重
    return  routes.filter(route => {
        // 根据route在childrenRoutes中进行查重吧所有重复的路由表进行剔除
        return  !childrenRoutes.find(childrenRoute => {
            return childrenRoute.path === route.path;
        });
    });
};

/**
 * 根据路由数据 返回对应的menu规则数据
 */
export const generateMenus = (routes,basePath = '') => {
  const result = [];
    // 不满足该条件 meta && meta.title && meta.icon 的数据不应该存在
    routes.forEach(item=>{
        // 不存在 children && 不存在meta 直接return
        if( isNull(item.children) && isNull(item.meta) )return;
        // 存在children 不存在meta
        if( isNull(item.meta) && !isNull(item.children) ){
            result.push(...generateMenus(item.children));
            return;
        }
        // 不存在children 存在meta
        // 因为最终的menu的路径需要进行跳转 所以我们得合并path
        const routePath = path.resolve(basePath,item.path);
        // 路由分离之后 可能存在同名父路由的情况
        let route = result.find(item=> item.path === routePath);
        // 当前路由不在result
        if(!route){
            route = {
                ...item,
                path:routePath,
                children:[]
            };
            // icon && title
            if( route.meta.icon && route.meta.title ){
                result.push(route);
            }
        }
        // 存在children && 存在meta
        if( !isNull(item.children) ){
            route.children.push(...generateMenus(item.children,route.path));
        }
    });
    return result;
};

/**
 * 判断数据是非为空
 * @param data
 * @returns {boolean}
 */
const isNull = (data) => {
  if(!data)return true;
  if( JSON.stringify(data) === '{}' )return  true;
  if( JSON.stringify(data) === '[]' )return true;
};
